/*
 * Copyright (C) 2023 HiHope Open Source Organization .
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

 #include <stdio.h>
 #include <unistd.h>
 
 #include "cmsis_os2.h"
 #include "ohos_init.h"
 #include "iot_gpio.h"
 
 /* 定义LED连接的GPIO引脚编号 */
 #define LED_TASK_GPIO 6
 /* 定义任务的堆栈大小 */
 #define LED_TASK_STACK_SIZE 1024
 /* 定义任务的优先级 */
 #define LED_TASK_PRIO   25
 /* 定义GPIO高电平 */
 #define GPIO_HIGH       (1)
 /* 定义GPIO低电平 */
 #define GPIO_LOW        (0)
 
 #define time_short 50
 #define time_long 300

 /* GPIO任务函数 */
 static void* GpioTask(void)
 {
     /* 初始化GPIO引脚 */
     IoTGpioInit(LED_TASK_GPIO);
     /* 设置GPIO引脚为输出模式 */
     IoTGpioSetDir(LED_TASK_GPIO, IOT_GPIO_DIR_OUT);
 
     /* 循环SOS信号 */
     while (1) {
         printf(" SOS!!!\n");
         // 短三次
         for(int i=0;i<3;i++){
         /* 将GPIO引脚设置为高电平（LED点亮） */
         IoTGpioSetOutputVal(LED_TASK_GPIO, GPIO_HIGH);
         /* 延迟50个ticks */
         osDelay(50);
         /* 将GPIO引脚设置为低电平（LED熄灭） */
         IoTGpioSetOutputVal(LED_TASK_GPIO, GPIO_LOW);
         /* 再次延迟50个ticks */
         osDelay(50);
         }

         // 长三次
         for(int i=0;i<3;i++){
            IoTGpioSetOutputVal(LED_TASK_GPIO, GPIO_HIGH);
            osDelay(500);
            IoTGpioSetOutputVal(LED_TASK_GPIO, GPIO_LOW);
            osDelay(50);
            }

        // 短三次
         for(int i=0;i<3;i++){
         IoTGpioSetOutputVal(LED_TASK_GPIO, GPIO_HIGH);
         osDelay(50);
         IoTGpioSetOutputVal(LED_TASK_GPIO, GPIO_LOW);
         osDelay(50);
         }
     }
     /* 结束任务 */
     return NULL;
 }
 
 /* 主任务入口函数 */
 static void GpioExampleEntry(void)
 {
     osThreadAttr_t attr;
 
     /* 配置任务属性 */
     attr.name = "GpioTask";
     attr.attr_bits = 0U;
     attr.cb_mem = NULL;
     attr.cb_size = 0U;
     attr.stack_mem = NULL;
     attr.stack_size = LED_TASK_STACK_SIZE;
     attr.priority = LED_TASK_PRIO;
 /*   
   - 初始化`osThreadAttr_t`结构体`attr`。
   - 设置任务名称为"GpioTask"。
   - 设置其他属性为默认值或指定值：
     - `attr_bits`：任务属性位掩码，默认为0。
     - `cb_mem` 和 `cb_size`：回调内存及其大小，默认为空。
     - `stack_mem`：堆栈内存，默认为空。
     - `stack_size`：堆栈大小为`LED_TASK_STACK_SIZE`。
     - `priority`：任务优先级为`LED_TASK_PRIO`。
*/

     /* 创建任务GpioTask */
     if (osThreadNew((osThreadFunc_t)GpioTask, NULL, &attr) == NULL) {
         printf("[GpioExample] Falied to create GpioTask!\n");
     }
 }

 SYS_RUN(GpioExampleEntry);